#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
动态创建类的另一种方法是使用元类，我们可以这么思考：
当我们定义了类以后，就可以根据这个类创建出实例，所以：先定义类，然后创建实例。那么类又如何创建呢？
答案就是通过元类创建。整个过程连接起来如下：
先定义元类，就可以创建类，最后创建实例
'''

def to_string(self):
    return ' '.join(self)

#元类是类的模板，必须从`type`类型派生,按照默认习惯，元类名总是以Metaclass结尾
class ListMetaclass(type):
    '''
    为应用该元类的类添加add方法，元类的作用是拦截类的创建，让类使用元类的__new__()方法来创建
    cls：元类本身的类对象
    name：应用类的名称
    bases：应用类的父类元组
    attrs：应用类的属性字典
    '''
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        attrs['__str__'] = to_string
        #return type(name, bases, attrs)
        #return type.__new__(cls, name, bases, attrs)
        return super(ListMetaclass, cls).__new__(cls, name, bases, attrs)

class MyList(list, metaclass=ListMetaclass):
    def __str__(self):
        return '-'.join(self)

mylist = MyList(['i', 'love'])
mylist.add('python')
print(mylist)       #i love python

